
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

/**
 * AUTO-GENERATED FILE. DO NOT MODIFY.
 */

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
import { __extends } from 'tslib';
import * as zrUtil from 'zrender/lib/core/util.js';
import ChartView from '../../view/Chart.js';
import * as graphic from '../../util/graphic.js';
import { setStatesStylesFromModel, toggleHoverEmphasis } from '../../util/states.js';
import Path from 'zrender/lib/graphic/Path.js';
import { saveOldStyle } from '../../animation/basicTransition.js';

var BoxplotView =
/** @class */
function (_super) {
	__extends(BoxplotView, _super);

	function BoxplotView() {
		var _this = _super !== null && _super.apply(this, arguments) || this;

		_this.type = BoxplotView.type;
		return _this;
	}

	BoxplotView.prototype.render = function (seriesModel, ecModel, api) {
		var data = seriesModel.getData();
		var group = this.group;
		var oldData = this._data; // There is no old data only when first rendering or switching from
		// stream mode to normal mode, where previous elements should be removed.

		if (!this._data) {
			group.removeAll();
		}

		var constDim = seriesModel.get('layout') === 'horizontal' ? 1 : 0;
		data.diff(oldData).add(function (newIdx) {
			if (data.hasValue(newIdx)) {
				var itemLayout = data.getItemLayout(newIdx);
				var symbolEl = createNormalBox(itemLayout, data, newIdx, constDim, true);
				data.setItemGraphicEl(newIdx, symbolEl);
				group.add(symbolEl);
			}
		}).update(function (newIdx, oldIdx) {
			var symbolEl = oldData.getItemGraphicEl(oldIdx); // Empty data

			if (!data.hasValue(newIdx)) {
				group.remove(symbolEl);
				return;
			}

			var itemLayout = data.getItemLayout(newIdx);

			if (!symbolEl) {
				symbolEl = createNormalBox(itemLayout, data, newIdx, constDim);
			} else {
				saveOldStyle(symbolEl);
				updateNormalBoxData(itemLayout, symbolEl, data, newIdx);
			}

			group.add(symbolEl);
			data.setItemGraphicEl(newIdx, symbolEl);
		}).remove(function (oldIdx) {
			var el = oldData.getItemGraphicEl(oldIdx);
			el && group.remove(el);
		}).execute();
		this._data = data;
	};

	BoxplotView.prototype.remove = function (ecModel) {
		var group = this.group;
		var data = this._data;
		this._data = null;
		data && data.eachItemGraphicEl(function (el) {
			el && group.remove(el);
		});
	};

	BoxplotView.type = 'boxplot';
	return BoxplotView;
}(ChartView);

var BoxPathShape =
/** @class */
function () {
	function BoxPathShape() {}

	return BoxPathShape;
}();

var BoxPath =
/** @class */
function (_super) {
	__extends(BoxPath, _super);

	function BoxPath(opts) {
		var _this = _super.call(this, opts) || this;

		_this.type = 'boxplotBoxPath';
		return _this;
	}

	BoxPath.prototype.getDefaultShape = function () {
		return new BoxPathShape();
	};

	BoxPath.prototype.buildPath = function (ctx, shape) {
		var ends = shape.points;
		var i = 0;
		ctx.moveTo(ends[i][0], ends[i][1]);
		i++;

		for (; i < 4; i++) {
			ctx.lineTo(ends[i][0], ends[i][1]);
		}

		ctx.closePath();

		for (; i < ends.length; i++) {
			ctx.moveTo(ends[i][0], ends[i][1]);
			i++;
			ctx.lineTo(ends[i][0], ends[i][1]);
		}
	};

	return BoxPath;
}(Path);

function createNormalBox(itemLayout, data, dataIndex, constDim, isInit) {
	var ends = itemLayout.ends;
	var el = new BoxPath({
		shape: {
			points: isInit ? transInit(ends, constDim, itemLayout) : ends
		}
	});
	updateNormalBoxData(itemLayout, el, data, dataIndex, isInit);
	return el;
}

function updateNormalBoxData(itemLayout, el, data, dataIndex, isInit) {
	var seriesModel = data.hostModel;
	var updateMethod = graphic[isInit ? 'initProps' : 'updateProps'];
	updateMethod(el, {
		shape: {
			points: itemLayout.ends
		}
	}, seriesModel, dataIndex);
	el.useStyle(data.getItemVisual(dataIndex, 'style'));
	el.style.strokeNoScale = true;
	el.z2 = 100;
	var itemModel = data.getItemModel(dataIndex);
	var emphasisModel = itemModel.getModel('emphasis');
	setStatesStylesFromModel(el, itemModel);
	toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));
}

function transInit(points, dim, itemLayout) {
	return zrUtil.map(points, function (point) {
		point = point.slice();
		point[dim] = itemLayout.initBaseline;
		return point;
	});
}

export default BoxplotView;